﻿using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using System.Net.Mail;
using MuaChung.Models;
using System.Text;
using System.Net;
using MuaChung.Base;

namespace MuaChung.Controllers
{

    [HandleError]
    public class AccountController : Controller
    {

        public IFormsAuthenticationService FormsService { get; set; }
        public IMembershipService MembershipService { get; set; }

        protected override void Initialize(RequestContext requestContext)
        {
            if (FormsService == null) { FormsService = new FormsAuthenticationService(); }
            if (MembershipService == null) { MembershipService = new AccountMembershipService(); }

            base.Initialize(requestContext);
        }

        // **************************************
        // URL: /Account/LogOn
        // **************************************
        public ActionResult LogOnUserControl()
        {
            return View();
        }

        public ActionResult LogOn()
        {
            return View();
        }

        [HttpPost]
        public ActionResult LogOn(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (MembershipService.ValidateUser(model.UserName, model.Password))
                {
                    FormsService.SignIn(model.UserName, model.RememberMe);
                    TAI_KHOAN tmp = AccountModel.FindByUsername(model.UserName);
                    if (tmp.Status == "Inactive")
                    {
                        return Redirect("ActivateUser");
                    }
                    if (!String.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        CouponModel.InitCart(model.UserName);
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Tên đăng nhập hoặc mật khẩu không đúng!");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

        // **************************************
        // URL: /Account/LogOff
        // **************************************

        public ActionResult LogOff()
        {
            FormsService.SignOut(User.Identity.Name);

            return RedirectToAction("Index", "Home");
        }

        // **************************************
        // URL: /Account/Register
        // **************************************

        public ActionResult Register()
        {
            ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
            return View();
        }

        [HttpPost]        
        public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                // Attempt to register the user
                CHITIET_TAIKHOAN tmp = new CHITIET_TAIKHOAN();
                tmp.CMND = model.CMND;
                tmp.DiaChi = model.DiaChi;
                tmp.DienThoai = model.SDT;
                tmp.HoTen = model.HoTen;
                tmp.NgayDK = DateTime.Now;
                tmp.NgaySinh = Convert.ToDateTime(model.NgaySinh);
                tmp.Ma_KichHoat = BaseWeb.GenerateRandomCode(10);
                MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email,tmp);

                string code = tmp.Ma_KichHoat;
                code += model.UserName;

                string activateLink = "" + HttpContext.Request.Url;
                activateLink = activateLink.Remove(activateLink.LastIndexOf('/'));
                activateLink += "/ActivateUser?code=" + code;
                string msgbody = "Chào bạn " + model.HoTen + ",<br/>" + "Chúc mừng bạn đã đăng ký tài khoản thành công tại trang MuaChung của chúng tôi.<br/>";
                msgbody += "Thông tin tài khoản: <br/>";
                msgbody += "Tên đăng nhập: " + model.UserName + "<br/>";
                msgbody += "Mật khẩu: " + model.Password + "<br/>";
                msgbody += "Mã kích hoạt của bạn là: " + tmp.Ma_KichHoat + "<br/>";
                msgbody += "Bạn có thể kích hoạt tài khoản của mình bằng cách đăng nhập vào trang <a href=\"\">MuaChung</a> để kích hoạt bằng mã kích hoạt này.<br/>";
                msgbody += "Hoặc có thể kích hoạt bằng cách click vào link kích hoạt tự động dưới đây: <br/>";
                msgbody += "<a href=\""+ activateLink +"\">Kích hoạt tài khoản</a><br/>";
                msgbody += "Thân.";
                msgbody += "<span style=\"color:red;font-size:9em;text-align:center;\">Hot Mỗi Ngày<br/>Không thể cưỡng lại!</span>";

                if (createStatus == MembershipCreateStatus.Success)
                {
                    FormsService.SignIn(model.UserName, true);
                    List<string> recvEmail = new List<string>();
                    recvEmail.Add(model.Email);
                    if (BaseWeb.SendMail("Web Mua Chung", "deal.hotmoingay@gmail.com", "hotmoingay", recvEmail, "Kích hoạt tài khoản Mua Chung", msgbody))
                    { }

                    return RedirectToAction("ActivateUser");
                }
                else
                {
                    ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
                }
            }

            // If we got this far, something failed, redisplay form
            ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
            return View(model);
        }
        // **************************************
        // URL: /Account/ChangePassword
        // **************************************

        [Authorize]
        public ActionResult ChangePassword()
        {
            ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
            return View();
        }

        [Authorize]
        [HttpPost]
        public ActionResult ChangePassword(ChangePasswordModel model)
        {
            if (ModelState.IsValid)
            {
                if (MembershipService.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword))
                {
                    return RedirectToAction("ChangePasswordSuccess");
                }
                else
                {
                    ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
                }
            }

            // If we got this far, something failed, redisplay form
            ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
            return View(model);
        }

        // **************************************
        // URL: /Account/ChangePasswordSuccess
        // **************************************

        public ActionResult ChangePasswordSuccess()
        {
            return View();
        }

        [Authorize]
        public ActionResult ActivateUser(string code = null)
        {
            ActivateModel model = new ActivateModel();
            if (code != null)
            {
                string makh = code.Substring(0, 10);
                string username = code.Substring(10);
                model.userName = username;
                TAI_KHOAN tmp = AccountModel.FindByUsername(model.userName);
                if (tmp.Status == "Activated")
                {
                    ViewData["status"] = "OK";
                    ViewData["Message"] = "Tài khoản đã được kích hoạt!";
                }
                else
                {
                    model.email = tmp.Email;
                    model.userID = tmp.ID;
                    CHITIET_TAIKHOAN tmp2 = AccountModel.FindDetail(model.userName);
                    if (makh == tmp2.Ma_KichHoat)
                    {
                        ViewData["status"] = "OK";
                        ViewData["Message"] = "Kích hoạt tài khoản thành công!";
                        AccountModel.ActivateUser(model.userName);
                    }
                    FormsService.SignIn(username, false);
                }
            }
            else
            {
                model.userName = User.Identity.Name;
                TAI_KHOAN tk = AccountModel.FindByUsername(model.userName);
                model.email = tk.Email;
                model.userID = tk.ID;
            }
            return View(model);            
        }

        [Authorize]
        [HttpPost]
        public ActionResult ActivateUser(FormCollection frm, ActivateModel model)
        {
            CHITIET_TAIKHOAN tmp = AccountModel.FindDetail(model.userName);
            
            if (frm.AllKeys[4] == "Resend")
            {
                TAI_KHOAN tk = AccountModel.FindByID(model.userID);
                tmp.Ma_KichHoat = BaseWeb.GenerateRandomCode(10);
                string code = tmp.Ma_KichHoat;
                code += model.userName;

                string activateLink = "" + HttpContext.Request.Url;
                activateLink = activateLink.Remove(activateLink.LastIndexOf('/'));
                activateLink += "/ActivateUser?code=" + code;
                string msgbody = "Chào bạn " + tmp.HoTen + ",<br/>" + "Chúc mừng bạn đã đăng ký tài khoản thành công tại trang MuaChung của chúng tôi.<br/>";
                msgbody += "Thông tin tài khoản: <br/>";
                msgbody += "Tên đăng nhập: " + model.userName + "<br/>";
                msgbody += "Mật khẩu: &ltđã được mã hóa&gt<br/>";
                msgbody += "Mã kích hoạt của bạn là: " + tmp.Ma_KichHoat + "<br/>";
                msgbody += "Bạn có thể kích hoạt tài khoản của mình bằng cách đăng nhập vào trang <a href=\"\">MuaChung</a> để kích hoạt bằng mã kích hoạt này.<br/>";
                msgbody += "Hoặc có thể kích hoạt bằng cách click vào link kích hoạt tự động dưới đây: <br/>";
                msgbody += "<a href=\"" + activateLink + "\">Kích hoạt tài khoản</a><br/>";
                msgbody += "Thân.";
                msgbody += "<span style=\"color:red;font-size:9em;text-align:center;\">Hot Mỗi Ngày<br/>Không thể cưỡng lại!</span>";
                List<string> recvEmail = new List<string>();
                recvEmail.Add(model.email);
                if (BaseWeb.SendMail("Web Mua Chung", "deal.hotmoingay@gmail.com", "hotmoingay", recvEmail, "Kích hoạt tài khoản Mua Chung", msgbody))
                {                    
                    AccountModel.UpdateActivateCode(model.userID, tmp.Ma_KichHoat);
                    ViewData["status"] = "Fail";
                    ViewData["Message"] = "Mail đã được gửi đến email " + model.email + " của bạn thành công!";
                }
                else
                {
                    ViewData["status"] = "Fail";
                    ViewData["Message"] = "Gửi mail kích hoạt đến email " + model.email + " của bạn thất bại!<br/> Vui lòng kiểm tra lại email trong <a href=\"/Account/AccountInfo\">Thông tin tài khoản</a> và thử lại lần nữa.";
                }
            }
            else
            {
                if (model.activatecode == tmp.Ma_KichHoat)
                {
                    ViewData["status"] = "OK";
                    ViewData["Message"] = "Kích hoạt tài khoản thành công!";
                    AccountModel.ActivateUser(model.userName);
                }
                else
                {
                    ViewData["status"] = "Fail";
                    ViewData["Message"] = "Kích hoạt tài khoản thất bại, mã kích hoạt không đúng!";
                }
            }
            return View(model);
        }        

        [Authorize]
        public ActionResult AccountInfo()
        {
            AccDetailModel model = new AccDetailModel();
            string username = User.Identity.Name;
            TAI_KHOAN tk = AccountModel.FindByUsername(username);
            CHITIET_TAIKHOAN cttk = AccountModel.FindDetail(tk.Username);

            model.CMND = cttk.CMND;
            model.DiaChi = cttk.DiaChi;
            model.Email = tk.Email;
            model.HoTen = cttk.HoTen;
            model.ngayDK = cttk.NgayDK;
            model.NgaySinh = cttk.NgaySinh;
            model.SDT = cttk.DienThoai;
            model.status = tk.Status;
            model.uid = tk.ID;
            model.UserName = tk.Username;

            return View(model);
        }

        [Authorize]
        [HttpPost]
        public ActionResult AccountInfo(AccDetailModel model)
        {
            if (AccountModel.UpdateAccountInfo(model))
            {
                ViewData["Message"] = "Lưu thay đổi thành công!";
            }
            else
            {
                ViewData["Message"] = "Lưu thay đổi thất bại!";
            }
            return View(model);
        }

        public ActionResult ForgetPassword()
        {
            return View();
        }

        [HttpPost]
        public ActionResult ForgetPassword(FormCollection frm)
        {
            string email = frm.GetValues("email").First();
            ViewData["email"] = email;
            if (email == "" || email == "Địa chỉ email...")
            {
                ViewData["Message"] = "Vui lòng nhập địa chỉ email!";
                return View();
            }
            else
            {
                TAI_KHOAN tk = AccountModel.FindByEmail(email);
                if (tk == null)
                {
                    ViewData["Message"] = "Địa chỉ email này vẫn chưa được dùng để đăng ký tài khoản!";
                    return View();
                }
                else
                {
                    string tmpPass = BaseWeb.GenerateRandomCode(7);
                    tk.Password = BaseWeb.getMd5Hash(tmpPass);
                    if (!AccountModel.UpdateAccount(tk))
                    {
                        ViewData["Message"] = "Cấp mật khẩu mới thất bại! Vui lòng thử lại lần nữa";                        
                        return View();
                    }
                    string emailBody = "Chào bạn " + AccountModel.FindDetail(tk.Username).HoTen + ",<br/>";
                    emailBody += "Bạn đã đăng ký nhận mật khẩu mới từ trang HotMoiNgay của chúng tôi.<br/>";
                    emailBody += "Tên đăng nhập của bạn: "+ tk.Username +"<br/>";
                    emailBody += "Mật khẩu mới của bạn là: <span style=\"color:blue\">" + tmpPass + "</span><br/>";
                    emailBody += "Để thuận tiện, vui lòng đăng nhập vào trang <a href=\"\" >HotMoiNgay</a> để thay đổi mật khẩu cho dễ nhớ.<br/>";
                    emailBody += "Thân.<br/>";
                    emailBody += "<span style=\"color:red;font-size:9em;text-align:center;\">Hot Mỗi Ngày<br/>Không thể cưỡng lại!</span>";
                    List<string> recver = new List<string>();
                    recver.Add(email);
                    if (BaseWeb.SendMail("Support Hot Mỗi Ngày", "deal.hotmoingay@gmail.com", "hotmoingay", recver, "HotMoiNgay-Nhận Mật Khẩu Mới", emailBody))
                    {
                        ViewData["Message"] = "Mật khẩu mới đã được gửi đến email " + email + " của bạn!";                        
                    }
                    else
                    {
                        ViewData["Message"] = "Gửi mail thất bại, vui lòng thử lại lần nữa!";
                    }
                }
            }
            return View();
        }

        [Authorize]
        public ActionResult UserPanel()
        {
            return View();
        }
    }
}
